home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / KEYWITCH / KW_S200.LZH / w11iocs.s < prev    next >
Text File  |  1995-03-20  |  13KB  |  630 lines

  1.     .include    w03const.mac
  2.     .include    w04macro.mac
  3.     .include    w05reloc.mac
  4.  
  5.     .text
  6.     .even
  7.  
  8. ********************************
  9. *キーデータバッファからデータを取り出す(_B_KEYINP)
  10. *  処理は元のルーチンに任せ、ここではASK68KでSHIFTなどがロックしないようにする。
  11. *  拡張キーデータバッファに対応する。
  12. *>d0.l:スキャンコード*$100+文字コード,入力がなければ0
  13. _b_keyinp::
  14.     bsr    trans_extend        *拡張バッファからキーデータバッファへ転送する
  15.     move.l    ask_mode_area(pc),d0
  16.     beq    _b_keyinp_4        *SHIFTなどがロックしないようにしない
  17.     pea.l    _b_keyinp_1(pc)
  18. _b_keyinp_4::
  19.     move.l    old_b_keyinp(pc),-(sp)    *元のルーチンを呼び出す
  20.     rts
  21.  
  22. _b_keyinp_1::
  23.     move.l    a0,-(sp)
  24.     move.l    d1,-(sp)
  25.     movea.l    ask_mode_area(pc),a0
  26.     cmp.w    #$7000,d0
  27.     blo    _b_keyinp_2
  28.     beq    _b_keyinp_shift_down    *SHIFTが押された
  29.     cmp.w    #$7200,d0
  30.     blo    _b_keyinp_ctrl_down    *CTRLが押された
  31.     beq    _b_keyinp_opt1_down    *OPT.1が押された
  32.     cmp.w    #$F000,d0
  33.     blo    _b_keyinp_2
  34.     beq    _b_keyinp_shift_up    *SHIFTが離された
  35.     cmp.w    #$F200,d0
  36.     blo    _b_keyinp_ctrl_up    *CTRLが離された
  37.     beq    _b_keyinp_opt1_up    *OPT.1が離された
  38. _b_keyinp_2::
  39.     move.l    (sp)+,d1
  40.     movea.l    (sp)+,a0
  41.     tst.l    d0
  42.     rts
  43.  
  44. *OPT.1が離された
  45. _b_keyinp_opt1_up::
  46.     moveq.l    #$0000_0004,d1
  47.     bra    _b_keyinp_3
  48.  
  49. *CTRLが離された
  50. _b_keyinp_ctrl_up::
  51.     moveq.l    #$0000_0002,d1
  52.     bra    _b_keyinp_3
  53.  
  54. *SHIFTが離された
  55. _b_keyinp_shift_up::
  56.     moveq.l    #$0000_0000,d1
  57.     bra    _b_keyinp_3
  58.  
  59. *OPT.1が押された
  60. _b_keyinp_opt1_down::
  61.     move.l    #$4000_0004,d1
  62.     bra    _b_keyinp_3
  63.  
  64. *CTRLが押された
  65. _b_keyinp_ctrl_down::
  66.     move.l    #$8000_0002,d1
  67.     bra    _b_keyinp_3
  68.  
  69. *SHIFTが押された
  70. _b_keyinp_shift_down::
  71.     move.l    #$0800_0000,d1
  72. *<d1.l:設定するデータ*$10000+フラグの位置(オフセット)
  73. _b_keyinp_3::
  74.     adda.w    d1,a0            *オフセットを加える(+0/2/4)
  75.     swap.w    d1
  76.     move.w    d1,(a0)            *フラグを更新する
  77.     bra    _b_keyinp_2
  78.  
  79. ********************************
  80. *キーデータバッファの先頭のデータを見る(_B_KEYSNS)
  81. *  拡張キーデータバッファに対応する。
  82. *>d0.l:$10000+スキャンコード*$100+文字コード,入力がなければ0
  83. _b_keysns::
  84.     bsr    trans_extend        *拡張バッファからキーデータバッファへ転送する
  85.     move.l    old_b_keysns(pc),-(sp)    *元のルーチンを呼び出す
  86.     rts
  87.  
  88. ********************************
  89. *キーボード関係の初期化(_KEYINIT)
  90. *<d1.b:LEDの初期状態
  91. *?d0
  92. _key_init::
  93.     movem.l    d1-d2/a0/a6,-(sp)
  94.     lea.l    base(pc),a6
  95. *割り込み禁止
  96.     di                *割り込み禁止
  97. *キーデータバッファ、BITSNSなどのワークを初期化
  98.     lea.l    BITSNS.w,a0        *IOCSのBITSNSワークのアドレス
  99.     moveq.l    #0,d0
  100.     moveq.l    #(BUFEND-BITSNS)/4-1,d2
  101. init_clear_1::
  102.     move.l    d0,(a0)+        *BITSNSワークとキーデータバッファを初期化
  103.     dbra    d2,init_clear_1
  104.     lea.l    KEYBUF.w,a0        *キーデータバッファの先頭
  105.     move.l    a0,BUFRED.w        *最初のデータの位置
  106.     move.l    a0,BUFWRT.w        *最後のデータの位置
  107. *    move.w    d0,BUFCNT.w        *キーデータバッファ内のデータ数
  108. *拡張バッファを初期化
  109.     tst.b    (extend_flag)r
  110.     beq    init_clear_3
  111. *    moveq.l    #0,d0
  112.     movea.l    (extend_head)r,a0    *拡張バッファの先頭
  113.     move.l    a0,(extend_read)r    *最初のデータの位置
  114.     move.w    d0,(extend_used)r    *データ数
  115.     move.w    (extend_size)r,d2    *拡張バッファのサイズ
  116.     subq.w    #1,d2
  117. @@:    move.w    d0,(a0)+        *バッファを初期化
  118.     dbra    d2,@b
  119.     subq.w    #2,a0
  120.     move.l    a0,(extend_last)r    *最後のデータの位置
  121. init_clear_3::
  122. *マトリクスとキューを初期化
  123.     lea.l    (matrix_bits)r,a0
  124. *    moveq.l    #0,d0
  125.     moveq.l    #(queue_head+Q_SIZE-matrix_bits)/4-1,d2
  126. init_clear_2::
  127.     move.l    d0,(a0)+        *マトリクスとキューを初期化
  128.     dbra    d2,init_clear_2
  129. *LEDの状態を初期化
  130.     and.b    #$7F,d1
  131.     move.b    d1,LEDSNS.w        *LEDの初期状態
  132.     lsl.b    #4,d1
  133.     move.b    d1,SFTSNS.w        *シフトキーの初期状態
  134. *割り込みマスクを初期化
  135.     bset.b    #4,IMRA            *キー入力割り込みマスクセット
  136.     nop
  137.     nop
  138.     bset.b    #3,SYSTEM3        *キーデータ送出許可
  139. *キーボードの初期化
  140.     moveq.l    #$41,d0            *マウスコントロール準備
  141.     bsr    key_out
  142.     moveq.l    #$49,d0            *キーボードロック解除(Compact)
  143.     bsr    key_out
  144.     moveq.l    #$59,d0            *キーデータ送出許可
  145.     bsr    key_out
  146.     moveq.l    #$51,d0            *X1コンパチ解除
  147.     bsr    key_out
  148.     moveq.l    #1,d0
  149.     and.b    SR_OPT2,d0        *OPT.2をテレビコントロールに使用するか
  150.     or.b    #$5C,d0            *テレビコントロールの使用状態
  151.     bsr    key_out
  152.     move.b    SR_DLY,d1        *リピート開始時間
  153.     bsr    _keydly
  154.     move.b    SR_REP,d1        *リピート間隔
  155.     bsr    _keyrep
  156.     moveq.l    #$54,d0            *LEDの明るさ(最も明るく)
  157.     bsr    key_out
  158. *LEDの初期化
  159.     tst.b    (lock_mode)r
  160.     beq    init_unlocked        *キー入力禁止モードではない
  161.     moveq.l    #$80,d0            *すべてのLEDを点灯する
  162.     bsr    key_out
  163.     bra    init_locked
  164.  
  165. init_unlocked::
  166.     bsr    _ledset            *LEDの状態を初期化
  167. init_locked::
  168. *キーボードの種類を判別する
  169.     sf.b    (compact_flag)r        *フラグをリセット
  170.     moveq.l    #$47,d0            *Compactチェック
  171.     bsr    key_out            *$FEが返ればCompact
  172. *割り込みレベルを復元
  173.     ei                *割り込みレベルを復元
  174.     movem.l    (sp)+,d1-d2/a0/a6
  175.     rts
  176.  
  177. ********************************
  178. *スキャンコードを文字コードに変換してキーデータバッファに転送する(_SKEYSET)
  179. *<d1.b:スキャンコード(最上位ビットはキーが押された=0/離された=1)
  180. *>d0.b:スキャンコード(最上位ビットはキーが押された=0/離された=1)
  181. _skeyset::
  182. *レジスタ待避
  183.     move.w    sr,-(sp)
  184.     movem.l    d1-d7/a0-a4/a6,-(sp)
  185. *相対アドレッシングのためのベースレジスタの設定
  186.     lea.l    base(pc),a6
  187. *KWCallを分離
  188.     cmp.w    #$FFFF,d1
  189.     beq    _skeyset_1        *KWCallの呼び出し
  190.     move.l    d1,-(sp)
  191. *Interrupt発生時のためのsspを設定
  192.     lea.l    4*14(sp),a0        *プッシュしたレジスタの個数に注意
  193.     move.l    a0,(interrupt_ssp)r
  194. *キー入力割り込みを禁止する
  195.     di_key                *キー入力割り込みを禁止する
  196. *_SKEYSETメインを呼び出す
  197.     bsr    skeyset_main        *_SKEYSETメイン
  198. *キー入力割り込みマスクを復元する
  199.     ei_key                *キー入力割り込みマスクを復元する
  200. *レジスタ復元
  201.     move.l    (sp)+,d0
  202. _skeyset_9::
  203.     movem.l    (sp)+,d1-d7/a0-a4/a6
  204.     move.w    (sp)+,sr
  205.     rts
  206.  
  207. *KWCall
  208. _skeyset_1::
  209.     swap.w    d1
  210. *<d1.w:KWCall番号
  211.     moveq.l    #-1,d0            *エラーコード
  212.     cmp.w    #(2f-1f)/2,d1
  213.     bcc    _skeyset_9
  214.     add.w    d1,d1
  215.     move.w    1f(pc,d1.w),d1
  216.     jsr    1f(pc,d1.w)
  217.     bra    _skeyset_9
  218.  
  219. 1:    .dc.w    ~__KWVersion-1b
  220.     .dc.w    ~__KWSimulate-1b
  221.     .dc.w    ~__KWPush-1b
  222.     .dc.w    ~__KWSetTask-1b
  223.     .dc.w    ~__KWIventProc-1b
  224.     .dc.w    ~__KWKeyProc-1b
  225.     .dc.w    ~__KWIntMode-1b
  226.     .dc.w    ~__KWRepeatMap-1b
  227.     .dc.w    ~__KWStopMap-1b
  228.     .dc.w    ~__KWAskMode-1b
  229.     .dc.w    ~__KWAsk-1b
  230.     .dc.w    ~__KWExtend-1b
  231.     .dc.w    ~__KWClick-1b
  232.     .dc.w    ~__KWDelay-1b
  233.     .dc.w    ~__KWFull-1b
  234.     .dc.w    ~__KWLock-1b
  235.     .dc.w    ~__KWJoyKey-1b
  236.     .dc.w    ~__KWLed-1b
  237.     .dc.w    ~__KWMeta-1b
  238.     .dc.w    ~__KWRepeat-1b
  239.     .dc.w    ~__KWProgram-1b
  240.     .dc.w    ~__KWStop-1b
  241.     .dc.w    ~__KWTvKey-1b
  242.     .dc.w    ~__KWExchange-1b
  243.     .dc.w    ~__KWDevice-1b
  244.     .dc.w    ~__KWCompact-1b
  245.     .dc.w    ~__KWLockMode-1b
  246.     .dc.w    ~__KWNumLed-1b
  247.     .dc.w    ~__KWLedMap-1b
  248.     .dc.w    ~__KWJoy1Map-1b
  249.     .dc.w    ~__KWJoy2Map-1b
  250. 2:
  251.  
  252. ~__KWVersion::
  253.     move.l    #'KW'*$10000+$0200,d0
  254.     rts
  255.  
  256. ~__KWSimulate::
  257.     move.w    d2,d1
  258.     move.w    d1,-(sp)
  259.     bsr    simulate_main
  260.     moveq.l    #0,d0
  261.     move.w    (sp)+,d0
  262.     rts
  263.  
  264. ~__KWPush::
  265.     move.w    d2,d0
  266.     bra    s_push
  267.  
  268. ~__KWSetTask::
  269.     lea.l    (active_task)r,a0
  270. kwcall_setpoint::
  271.     move.l    (a0),d0
  272.     move.l    a1,d1
  273.     bmi    @f
  274.     move.l    a1,(a0)
  275. @@:    rts
  276.  
  277. ~__KWIventProc::
  278.     cmp.w    #(sbreak_proc-break_proc)/4,d2
  279.     bhi    @f
  280.     lea.l    (break_proc)r,a0
  281.     add.w    d2,d2
  282.     add.w    d2,d2
  283.     adda.w    d2,a0
  284.     move.l    (a0),d0
  285.     move.l    a1,d1
  286.     bmi    @f
  287.     move.l    d1,(a0)
  288. @@:    rts
  289.  
  290. ~__KWKeyProc::
  291.     lea.l    (skeyset_proc)r,a0
  292.     bra    kwcall_setpoint
  293.  
  294. ~__KWIntMode::
  295.     lea.l    (int_mode)r,a0
  296.     bra    kwcall_flags
  297.  
  298. ~__KWRepeatMap::
  299.     lea.l    (live_repeat_bits)r,a0
  300. kwcall_repeat::
  301.     move.l    a0,d0
  302.     move.l    a1,d1
  303.     bmi    @f
  304.  .rept 16/4
  305.     move.l    (a1)+,(a0)+
  306.  .endm
  307. @@:    rts
  308.  
  309. ~__KWStopMap::
  310.     lea.l    (kill_repeat_bits)r,a0
  311.     bra    kwcall_repeat
  312.  
  313. ~__KWAskMode::
  314.     move.l    (ask_flag_bits)r,d0
  315.     rts
  316.  
  317. ~__KWAsk::
  318.     moveq.l    #1,d0
  319.     and.b    (ask_flag)r,d0
  320.     rts
  321.  
  322. ~__KWExtend::
  323.     moveq.l    #1,d0
  324.     and.b    (extend_flag)r,d0
  325.     rts
  326.  
  327. ~__KWClick::
  328.     lea.l    (compact_flag)r,a0
  329.     bra    kwcall_flags
  330.  
  331. ~__KWDelay::
  332.     lea.l    (delay_flag)r,a0
  333.     bra    kwcall_flags
  334.  
  335. ~__KWFull::
  336.     lea.l    (full_flag)r,a0
  337.     bra    kwcall_flags
  338.  
  339. ~__KWLock::
  340.     lea.l    (lock_flag)r,a0
  341.     bra    kwcall_flags
  342.  
  343. ~__KWJoyKey::
  344.     lea.l    (joykey_flag)r,a0
  345.     bra    kwcall_flags
  346.  
  347. ~__KWLed::
  348.     lea.l    (led_flag)r,a0
  349.     bra    kwcall_flags
  350.  
  351. ~__KWMeta::
  352.     lea.l    (meta_flag)r,a0
  353.     bra    kwcall_flags
  354.  
  355. ~__KWRepeat::
  356.     lea.l    (repeat_flag)r,a0
  357.     bra    kwcall_flags
  358.  
  359. ~__KWProgram::
  360.     lea.l    (prog_flag)r,a0
  361.     bra    kwcall_flags
  362.  
  363. ~__KWStop::
  364.     lea.l    (stop_flag)r,a0
  365.     bra    kwcall_flags
  366.  
  367. ~__KWTvKey::
  368.     lea.l    (tvkey_flag)r,a0
  369.     bra    kwcall_flags
  370.  
  371. ~__KWExchange::
  372.     lea.l    (exchange_flag)r,a0
  373.     bra    kwcall_flags
  374.  
  375. ~__KWDevice::
  376.     moveq.l    #1,d0
  377.     and.b    (device_flag)r,d0
  378.     rts
  379.  
  380. ~__KWCompact::
  381.     lea.l    (compact_flag)r,a0
  382.     bra    kwcall_flags
  383.  
  384. ~__KWLockMode::
  385.     moveq.l    #1,d0
  386.     and.b    (lock_mode)r,d0
  387. kwcall_rts::
  388.     rts
  389.  
  390. ~__KWNumLed::
  391.     lea.l    (num_led)r,a0
  392.     bsr    kwcall_flags
  393.     bra    _numset
  394.  
  395. ~__KWLedMap::
  396.     lea.l    (led_map)r,a0
  397.     move.l    a0,d0
  398.     move.l    a1,d1
  399.     bmi    kwcall_rts
  400.     moveq.l    #7-1,d1
  401.     bra    kwcall_minimap
  402.  
  403. ~__KWJoy1Map::
  404.     lea.l    (joy1_map)r,a0
  405. kwcall_joymap::
  406.     move.l    a0,d0
  407.     move.l    a1,d1
  408.     bmi    2f
  409.     moveq.l    #8-1,d1
  410. kwcall_minimap::
  411. 1:    move.b    (a1)+,(a0)+
  412.     dbra    d1,1b
  413. 2:    rts
  414.  
  415. ~__KWJoy2Map::
  416.     lea.l    (joy2_map)r,a0
  417.     bra    kwcall_joymap
  418.  
  419. kwcall_flags::
  420.     moveq.l    #1,d0
  421.     and.b    (a0),d0
  422.     tst.l    d2
  423.     bmi    @f
  424.     sne.b    (a0)
  425. @@:    rts
  426.  
  427. ********************************
  428. *LEDの状態をまとめて設定する(_LEDCTRL)
  429. *<d1.b:LEDの状態(1のビットが点灯,最上位ビットは無視)
  430. *?d0
  431. _ledctrl::
  432.     move.b    lock_mode(pc),d0
  433.     bne    _ledctrl_3        *禁止されているときは操作させない
  434.     move.b    led_flag(pc),d0
  435.     beq    _ledctrl_4        *LEDを入れ替えない
  436.     move.l    a0,-(sp)
  437.     move.l    d2,-(sp)
  438.     lea.l    led_map(pc),a0        *LEDの入れ替えテーブル
  439.     moveq.l    #-1,d0
  440.     moveq.l    #7-1,d2
  441. _ledctrl_1::
  442.     btst.l    d2,d1
  443.     beq    _ledctrl_2        *消灯する
  444.     and.b    (a0,d2.w),d0        *点灯するLEDのビットをクリア
  445. _ledctrl_2::
  446.     dbra    d2,_ledctrl_1
  447.     bsr    key_out            *キーポートに出力する
  448.     move.l    (sp)+,d2
  449.     movea.l    (sp)+,a0
  450. _ledctrl_3::
  451.     rts
  452.  
  453. _ledctrl_0::
  454. *LEDを入れ替えない
  455. _ledctrl_4::
  456.     move.b    d1,d0            *LEDの状態
  457.     not.b    d0
  458.     tas.b    d0
  459. *    bra    key_out            *キーポートに出力する
  460. ********************************
  461. *キーポートに出力する
  462. *<d0.b:出力データ
  463. key_out::
  464.     tst.b    TSR
  465.     bpl    key_out            *出力中
  466.     move.b    d0,UDR            *キーポートに出力する
  467.     rts
  468.  
  469. ********************************
  470. *NUMキーのLEDの状態を初期化する
  471. *?d0
  472. _numset::
  473.     move.b    (lock_mode)r,d0
  474.     bne    _numset_9
  475.     moveq.l    #1,d0
  476.     and.b    (num_led)r,d0        *NUMキーのLEDの状態
  477.     or.b    #$44,d0
  478.     bra    key_out
  479.  
  480. _numset_9::
  481.     rts
  482.  
  483. ********************************
  484. *LEDの状態を初期化する(_LEDSET)
  485. _ledset::
  486.     move.w    d1,-(sp)
  487.     move.l    d0,-(sp)
  488.     move.b    LEDSNS.w,d1        *LEDの状態
  489.     bsr    _ledctrl
  490.     move.l    (sp)+,d0
  491.     move.w    (sp)+,d1
  492.     rts
  493.  
  494. ********************************
  495. *リピート開始時間を設定する(_KEYDLY)
  496. *<d1.b:リピート開始時間
  497. *?d0
  498. _keydly::
  499.     moveq.l    #$0F,d0
  500.     and.b    d1,d0
  501.     or.b    #$60,d0
  502.     bra    key_out            *キーポートに出力する
  503.  
  504. ********************************
  505. *リピート間隔を設定する(_KEYREP)
  506. *<d1.b:リピート間隔
  507. *?d0
  508. _keyrep::
  509.     moveq.l    #$0F,d0
  510.     and.b    d1,d0
  511.     or.b    #$70,d0
  512.     bra    key_out            *キーポートに出力する
  513.  
  514. ********************************
  515. *LEDの状態を設定する(_LEDMOD)
  516. *<d1.l:LEDの番号
  517. *<d2.b:消灯=0/点灯=1
  518. *>d0.l:エラーなし=0/あり=-1
  519. _ledmod::
  520.     move.l    a4,-(sp)
  521.     lea.l    BITSNS.w,a4        *IOCSのBITSNSワークのアドレス
  522.     move.b    lock_mode(pc),d0
  523.     beq    _ledmod_unlocked    *禁止されていない
  524.     lea.l    lock_map(pc),a4        *禁止状態で使うマップ
  525. _ledmod_unlocked::
  526.     moveq.l    #-1,d0            *エラーのときの返却値
  527.     cmp.b    #6,d1
  528.     bhi    _ledmod_9        *LEDの番号がおかしい
  529.     tst.b    d2
  530.     beq    _ledmod_0        *消灯する
  531. *点灯する
  532.     bset.b    d1,LEDSNS-BITSNS(a4)
  533.     bne    _ledmod_8        *既に点灯していた
  534.     move.b    d1,d0
  535.     subq.b    #2,d0
  536.     bpl    _ledmod_1        *かな,ローマ字以外
  537.     subq.b    #1,d0
  538.     and.b    d0,LEDSNS-BITSNS(a4)    *かなとローマ字は同時に点灯しない
  539.     bra    _ledmod_1
  540.  
  541. *消灯する
  542. _ledmod_0::
  543.     bclr.b    d1,LEDSNS-BITSNS(a4)
  544.     beq    _ledmod_8        *既に消灯していた
  545. _ledmod_1::
  546.     cmp.b    #4,d1
  547.     bhs    _ledmod_2        *LEDSNSの下半分は変化していない
  548.     move.w    LEDSNS-BITSNS(a4),d0    *LEDSNSの下半分をSFTSNSの上半分にコピー
  549.     lsl.b    #4,d0
  550.     lsr.w    #4,d0
  551.     move.b    d0,SFTSNS-BITSNS(a4)
  552. _ledmod_2::
  553.     bsr    _ledset            *LEDの状態を設定
  554. _ledmod_8::
  555.     moveq.l    #0,d0            *エラーなし
  556. _ledmod_9::
  557.     movea.l    (sp)+,a4
  558.     rts
  559.  
  560. ********************************
  561. *ジョイスティックのデータを読み込む(_JOYGET)
  562. *  ジョイスティックからの入力は元のルーチンに任せ、キー入力のみ処理する。
  563. *  メガドライブ用ジョイスティックやマルチセレクタなどは、
  564. *  他の常駐プログラムで対応する。
  565. *<d1.w:ジョイスティックの番号(標準より少し拡張)
  566. *    bit0:ジョイスティック1=0/ジョイスティック2=1
  567. *    bit7:入力=0/その他=1
  568. *>d0.b:ジョイスティックのデータ(ON=0/OFF=1)
  569. *    bit7:1(拡張用)
  570. *    bit6:Bボタン
  571. *    bit5:Aボタン
  572. *    bit4:1(拡張用)
  573. *    bit3:右
  574. *    bit2:左
  575. *    bit1:下
  576. *    bit0:上
  577. _joyget::
  578.     move.l    d1,-(sp)        *ジョイスティックの番号
  579.     pea.l    _joyget_1(pc)
  580.     move.l    old_joyget(pc),-(sp)    *元のルーチンを呼び出す
  581.     rts
  582.  
  583. _joyget_1::
  584.     move.b    joykey_flag(pc),d1
  585.     beq    _joyget_end        *キーボードからジョイスティックの操作をしない
  586. *パラメータを確認
  587.     move.b    3(sp),d1        *ジョイスティックの番号
  588.     bmi    _joyget_end        *接続の確認など
  589. *キーの状態をジョイスティックからの入力に反映させる
  590.     movem.l    d2-d4/a0-a1,-(sp)
  591.     lea.l    joy1_map(pc),a0        *ジョイスティック1のキーの割り当て
  592.     lsr.w    #1,d1            *bit0だけチェックする
  593.     bcc    _joyget_stick_1
  594.     lea.l    joy2_map(pc),a0        *ジョイスティック2のキーの割り当て
  595. _joyget_stick_1::
  596.     lea.l    BITSNS.w,a1        *IOCSのBITSNSワークのアドレス
  597.     moveq.l    #0,d2
  598.     moveq.l    #-1,d4
  599.     moveq.l    #8-1,d1            *標準で常に1のビットも操作する
  600. _joyget_loop::
  601.     move.b    (a0,d1.w),d2        *スキャンコード
  602.     beq    _joyget_keyup        *割り当てられていない
  603.     move.b    d2,d3
  604.     lsr.w    #3,d2
  605.     btst.b    d3,(a1,d2.w)        *キーの状態を確認
  606.     beq    _joyget_keyup        *対応するキーが押されていない
  607.     bclr.l    d1,d4            *入力に反映させる
  608. _joyget_keyup::
  609.     dbra    d1,_joyget_loop
  610. *上と下が同時に押されていないか
  611.     moveq.l    #%00000011,d1        *bit0:上/bit1:下
  612.     and.b    d4,d1
  613.     bne    _joyget_up_down_0    *同時に押されていない
  614.     addq.b    #%00000011,d4        *両方キャンセルする
  615. _joyget_up_down_0::
  616. *左と右が同時に押されていないか
  617.     moveq.l    #%00001100,d1        *bit2:左/bit3:右
  618.     and.b    d4,d1
  619.     bne    _joyget_left_right_0    *同時に押されていない
  620.     add.b    #%00001100,d4        *両方キャンセルする
  621. _joyget_left_right_0::
  622. *キーボードの情報を合成する
  623.     and.b    d4,d0
  624.     movem.l    (sp)+,d2-d4/a0-a1
  625. *JOYGET終わり
  626. _joyget_end::
  627.     move.l    (sp)+,d1
  628.     tst.b    d0
  629.     rts
  630.